package top.riske.imagebed.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import top.riske.imagebed.entity.CFile;

import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.time.LocalDateTime;

/**
 * 文件工具类
 * created by vital on 2025/3/5 上午8:43
 */
public class FileUtils {

    private static final Logger log = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 保存文件到本地磁盘，
     * 最终存储位置为：path+fileName+文件后缀
     * @param sourceFile 文件
     * @param path 保存路径，使用绝对路径，如./file/2024/10/18/
     * @param fileName 文件名
     * @param fileHash 文件哈希值
     * @return 包含文件名，文件大小，路径的CFile对象
     */
    public static CFile saveFile(MultipartFile sourceFile, String path, String fileName, String fileHash) throws IOException {
        // 构建文件保存路径
        String fullPath = getFullFilePath(sourceFile, path, fileName);
        log.info("完整文件路径：{}", fullPath);

        // 生成文件
        File file = new File(fullPath);

        // 保存文件
        try {
            sourceFile.transferTo(file);
        } catch (IOException e) {
            throw new IOException("文件保存失败: transferTo失败");
        }

        return CFile.builder()
                .fileSize(sourceFile.getSize())
                .fileHash(fileHash)
                .path(fullPath)
                .createdTime(LocalDateTime.now())
                .deleted(false)
                .build();
    }

    /**
     * 构建完整的文件保存路径，绝对路径
     * @param sourceFile 文件
     * @param path 文件保存路径，如./file/2024/10/18/
     * @param fileName 文件名
     * @return 返回完整的文件路径，绝对路径，如D:\\file\\2024\\10\\18\\test.jpg
     * @throws IOException
     */
    private static String getFullFilePath(MultipartFile sourceFile, String path, String fileName) throws IOException {
        File dir = new File(path);
        //所保存的目录不存在，则创建目录
        if (!dir.exists())
        {
            if(!dir.mkdirs()){
                throw new IOException("创建保存目录失败");
            }
        }

        // 获取源文件的后缀名
        String originalFileName = sourceFile.getOriginalFilename();
        if (originalFileName.isEmpty()) {
            throw new IOException("文件名为空");
        }

        // 获取文件类型扩展名
        String fileType = getFileType(originalFileName);
        // 获取目录路径
        String dirPath = dir.getCanonicalPath();
        // 构建完整的文件路径
        return dirPath + "/" + fileName + fileType;
    }

    /**
     * 获取文件类型，带点
     * @param fileName 文件名
     * @return 返回带点的文件类型，如.jpg
     */
    public static String getFileType(String fileName) {
        //以.分隔文件名
        String[] fileSufix = fileName.split("\\.");
        if(fileSufix.length < 1){
            // 文件名没有后缀
            return "";
        }

        //以最后一个分隔符为文件类型
        return  "." + fileSufix[fileSufix.length - 1];
    }


}